home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / misc / eb5.zip / PACK1.PRG / EB / EB2.REP < prev    next >
Text File  |  1994-12-03  |  106KB  |  2,621 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.                           EASY BASE USERS MANUAL
  7.                           ══════════════════════
  8.  
  9.                                 Contents
  10.                                 ────────
  11.  
  12.  
  13.  
  14.  
  15.             System Overview..............................   1
  16.  
  17.             Data Management Principles...................   2
  18.  
  19.             Form Design..................................   6
  20.  
  21.             Relationships and Lookups....................  11
  22.  
  23.             Data Entry...................................  15
  24.  
  25.             Procedures (Reporting).......................  20
  26.  
  27.             Procedures (Transactional)...................  36
  28.  
  29.             User Menus...................................  39
  30.  
  31.             System Requirements and Limitations..........  43
  32.  
  33.             DOS Filename Convention......................  44
  34.  
  35.  
  36.       Easy Base is copyright (c) John Turnbull 1994 published by:-
  37.  
  38.       Easy Software                   Tel/FAX (044) (0) 625 614669
  39.       3 Brookside Court               CIS 100410,717
  40.       Prestbury Road
  41.       Macclesfield
  42.       SK10 3BR
  43.       UK
  44. ................................................................................
  45.  
  46.  
  47.  
  48.  
  49.                                TERMINOLOGY
  50.                                ═══════════
  51.  
  52.  
  53.      Field          The storage space for an individual data item.
  54.      ─────
  55.  
  56.      Record         A set of related data items.
  57.      ──────
  58.  
  59.      Form           The storage space for a set of records.
  60.      ────
  61.  
  62.      Procedure      A set of instructions which manipulate the data
  63.      ─────────      stored in forms.
  64.  
  65.      Relationship   A record in the relationships form recording
  66.      ────────────   a link between forms.
  67.  
  68. ................................................................................
  69.  
  70.  
  71.                       EASY BASE SYSTEM OVERVIEW
  72.  
  73.      Easy Base is a complete rapid programming system for data
  74.      management. Virtually every data management problem can be
  75.      broken down into three areas. Creating disk files (referred to
  76.      as "Forms" in Easy Base) in which to store data, creating
  77.      procedures which manipulate that data and presenting those
  78.      forms and procedures in a logical menu system for use.
  79.  
  80.      In Easy Base you create the forms in which to store data in a
  81.      simple screen-painting environment which not only designs the
  82.      data file but at the same time provides a default data entry
  83.      screen for your data. As you place the "Fields" in which data
  84.      is to be stored you can use relational links ("Lookups") to
  85.      import data from other forms. Each field you create for data
  86.      storage is also treated as a deriveable "Cell" similar to a
  87.      spread sheet. You can make almost any calculation or derivation
  88.      within a field as, apart from all arithmetic, relational and
  89.      logical operators, Easy Base also provides a set of over fifty
  90.      functions covering everything from Modulo arithmetic to
  91.      spelling out dates. Once you have created your forms you can
  92.      use the default screen to enter and view your data using the
  93.      "Data Entry" system.
  94.  
  95.      Once you have data stored you will need to be able to
  96.      manipulate it and report on it. Easy Base provides a combined
  97.      transaction and reporting system ("Procedure Generator"). With
  98.      the procedure generator you can use the default screens you
  99.      have designed or create custom screens in which to gather input
  100.      either from the keyboard or from relational Lookups. You then
  101.      instruct Easy Base what to do with this information using a
  102.      simple "Basic" like programming language. If your procedure is
  103.      transactional you have commands to enter, modify or delete
  104.      records in any number of forms within a single procedure. If
  105.      your procedure is reporting then there are commands to group,
  106.      order and list data in almost every conceivable way.
  107.  
  108.      You now have all the "Parts" required to create a useful data
  109.      management program. All that remains is to tie your procedures
  110.      to a menu system so that other people can use your application
  111.      without having to know anything about Easy Base. Creating an
  112.      end user menu system in Easy base is as simple as filling in a
  113.      form with the text you wish to display and the procedure or
  114.      form you wish to run. You give at least one of your menus a
  115.      start up password. If you then restart Easy Base but sign on
  116.      with that password instead of your developers password then you
  117.      will be running your own custom designed program.
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.                                  - 1 -
  126. ................................................................................
  127.  
  128.  
  129.                      DATA MANAGEMENT PRINCIPLES
  130.  
  131.      In Easy Base, creating forms and entering data is very easy.
  132.      You will be tempted to rush on and create programs for yourself
  133.      without reading the "Bumf". However, unless you are an
  134.      experienced data programmer, you should at least read this
  135.      section and the one on Relationships before embarking on any
  136.      serious project.
  137.  
  138.      The crux of data management is "Data Integrity" or "Data
  139.      Verification".  You might know that "A Smith", "Smith's Garage"
  140.      and "Smith and Son" are all the same customer of yours but your
  141.      computer definitely does not! If you have a small business you
  142.      might wish to use Easy Base to create invoices - you might be
  143.      tempted to start by creating an invoice form in which you enter
  144.      your customers name, work done and price. - DON'T - Start
  145.      instead by creating a form to hold each of your customers'
  146.      names, addresses, credit limit etc.  If you sell things then
  147.      create a form to hold each of your stock items with their name,
  148.      partno, price etc.  These are your "Core" data forms from
  149.      which you "Lookup" data for other purposes. Each of your "Core"
  150.      data forms has a "Unique" field which defines the record as an
  151.      entity. "Smith's Garage" will always be "Smith's Garage" and
  152.      the lookup function described later will not allow any other
  153.      representation to be entered.
  154.  
  155.      Although of less significance than "Data Integrity", the names
  156.      which you give to forms and fields are very important and worth
  157.      mentioning now. When you come to write "Lookup" derivations and
  158.      later, Procedural code you have to refer to your data by a
  159.      combination of its form and field names. Please give
  160.      considerable thought to the names you use. Each name should be
  161.      short but fully describe the form or field. The names of forms
  162.      should be plural and the names of fields singular. For example
  163.      - a form which is to hold details of your customers should be
  164.      called "Customers", the name field should be called "Name" and
  165.      the credit limit field should be called "Creditlimit" . When
  166.      you need to lookup data from this form the lookup function will
  167.      be written - Lookup(customers,name) and when you write
  168.      procedures the data will be referred to as customers.name ,
  169.      customers.creditlimit etc.  If you did not follow this naming
  170.      convention and called the form "F1" , the name field "customer"
  171.      and the credit limit field "Max cred" then writing procedure
  172.      code would be extremely frustrating.
  173.  
  174.      It is equally important to give the same name to fields which
  175.      hold the same data in different forms. If you already had a
  176.      form called "Employees" which had fields "Worksno", "Name",
  177.      "Address" and "Taxcode" and you then created a "Payslips" form
  178.      the fields which hold the employee's name and taxcode should
  179.      also be called "Name" and "Taxcode". This not only makes it
  180.      easier to remember field names but when you come to write
  181.  
  182.  
  183.                                  - 2 -
  184. ................................................................................
  185.  
  186.  
  187.      procedure code, data can be transferred between one form and
  188.      another with the command "Copy all from". This command only
  189.      transfers data between fields with the same name. If you have
  190.      given different names to the fields in the two forms you will
  191.      have to transfer each individual field separately.
  192.  
  193.      The fields which you create are of four general types - The
  194.      definition (unique) field, grouping fields, ordering fields and
  195.      descriptive fields.
  196.  
  197.      When you create your "Core" data forms it will be fairly
  198.      obvious which is the definition field. In the "Employees" form
  199.      "Worksno" defines the record. In a "Manufacturers" form "Name"
  200.      defines the record. As a general rule, each form should have a
  201.      definition field. There is an exception to this where a form is
  202.      used to store temopary lists (described later) but for the
  203.      moment you should expect to have a definition or "Unique" field
  204.      on each form to prevent duplicate entries. When you create
  205.      secondary forms which lookup data from your "Core" forms the
  206.      data which defines the record as an entity will not necessarily
  207.      be contained solely in one of the fields you wish to display.
  208.  
  209.      As an example - A magazine wholesaler has two "Core" forms, one
  210.      containing details of the magazines he supplies and one
  211.      containing customers details. He creates a form on which to
  212.      record orders from his customers. This "orders" form has three
  213.      fields, "Name"(for the customer), "Magazine" and "Quantity".
  214.      When a customer phones in an order for a particular magazine
  215.      the wholesaler will need to be warned if this particular
  216.      customer has already ordered this particular magazine but no
  217.      one field defines the record. In fact the record is defined as
  218.      unique by a combination of the two fields "Name" and "Magazine"
  219.      In this case, a fourth field should be added to the form in
  220.      which the two fields "Name" and "Magazine" are combined using
  221.      the "jointext" function. This field is then the "Unique" field
  222.      and no duplicate entries will be allowed.
  223.  
  224.      In many secondary forms the records definition will be even
  225.      less obvious but if you are to create data storage for flexible
  226.      reporting you should always attempt to create a suitable
  227.      "unique" field.
  228.  
  229.      For example :- An "Aircraft" form has a field "Manufacturer"
  230.      which is looked up from a "Manufacturers" form. It also has
  231.      fields for "Name" and "Mark". The definition of an aircraft is
  232.      what it is known as. If it has a name then it is known as a
  233.      combination of the manufacturer and the name (Supermarine
  234.      Spitfire) but if it does not have a name it is known as a
  235.      combination of the manufacturer and mark (English Electric P1b)
  236.      Even in these more complicated situations you can still create
  237.      a unique field to prevent duplicates. In the above example you
  238.      would create the unique field "Knownas" and derive it with the
  239.  
  240.  
  241.                                  - 3 -
  242. ................................................................................
  243.  
  244.  
  245.      formula - Jiontext(manufacturer,if(name = blank,mark,name))
  246.  
  247.      When you define a field as unique Easy Base automatically
  248.      indexes this field.
  249.  
  250.      The second type of field is a "Grouping" field. This is a field
  251.      which will be used in procedures to select subsets of records.
  252.      In the "Aircraft" form you might add a field "Type" which would
  253.      qualify each record as belonging to a group - "Fighter",
  254.      "Bomber", "Transport" etc. Grouping fields should also be
  255.      defined as indexed and should always be subject to data
  256.      integrity checking. Where the number of groups is small (17 or
  257.      less) Easy Base provides a quick method of data verification in
  258.      the "Choice" field type. If the number of groups is larger than
  259.      17 then you should create a "Core" form to hold the group names
  260.      and look them up into the secondary form.
  261.  
  262.      The third type of field is used for ordering data. In many
  263.      instances the order in which you wish to print or view data
  264.      will be that of the definition field or one of the grouping
  265.      fields but not always. In the "Aircraft" form you might wish to
  266.      list them by the dates they were first introduced or by the
  267.      total production runs. In order to do this you would have to
  268.      add fields for "Date" and "Production". You would later write
  269.      procedures to list the aircraft with "Date in order" or
  270.      "production in order". Ordering fields should also be indexed
  271.      but they need not necessarily be checked for data integrity.
  272.  
  273.      Fields which are not used for ordering or grouping are
  274.      descriptive and need not be indexed or integrity checked.
  275.  
  276.      One of the most common mistakes made by beginners to data
  277.      management is to create different forms for the same data.
  278.      With the "Aircraft" form above you might be tempted to save all
  279.      the military aircraft of World War 1. Later you might create a
  280.      second form for the aircraft of World War 2. This would be a
  281.      mistake. The data you are recording is "Aircraft". The era to
  282.      which they belong should simply be another "Grouping" field.
  283.      If having saved your data you were asked for a list of all
  284.      "Boeing" military aircraft showing which wars they were used in
  285.      then this could be achieved with one simple procedure if they
  286.      were in one form but would be rather more difficult if they
  287.      were in two.
  288.  
  289.      That example was fairly obvious but on many occasions it will
  290.      be easy to assume that two or more sets of data are separate
  291.      when in fact they are simply groups of the same.
  292.  
  293.      Should you decide to write your own accounting program (Which
  294.      is not as daunting a task as it might seem on the surface) You
  295.      might be tempted to create forms for a Sales Ledger, Nominal
  296.      Ledger and Customers Accounts. In fact the entries in the
  297.  
  298.  
  299.                                  - 4 -
  300. ................................................................................
  301.  
  302.  
  303.      Nominal Ledger and Customers Accounts are simply sub groups of
  304.      the entries in the Sales Ledger. Provided that you include
  305.      grouping fields for the customers account number and nominal
  306.      account name you can construct customers and nominal accounts
  307.      when required by extracting and totalling the sub sets. There
  308.      is no need to save them as separate data.
  309.  
  310.      The final problem you will encounter when deciding how to store
  311.      data is that of "Related Lists".  Consider the "Aircraft" form.
  312.      If you had a grouping for "Airliner" you might wish to record
  313.      all the airlines which operate each aircraft. You cannot just
  314.      add fields to the "Aircraft" form - One airliner might only be
  315.      operated by one airline and another might be operated by fifty.
  316.  
  317.      To store this data you need another form let's call it Userlist
  318.      with fields "Aircraft" , "Airline" and "Uni" which is the
  319.      unique field derived by joining the other two. The "Aircraft"
  320.      field is looked up from the "Aircraft" forms unique field
  321.      "Knownas" and the "Airline" field is looked up from the
  322.      "Airlines" form "Name" field which is also unique.
  323.  
  324.      In this form you enter one record for each combination of
  325.      aircraft and airline. When you come to report on your data you
  326.      can list single records from the main "Aircraft" form together
  327.      with all related records from the "Userlist" form.
  328.  
  329.      ...................PROCEDURE CODE.............
  330.      declare output fields
  331.         aircraft.knownas : Aircraft.production :aircraft.seats
  332.         userlist.airline
  333.      end
  334.      for aircraft with knownas = input.knownas
  335.         print formfields
  336.         for userlist with aircraft = aircraft.knownas
  337.            print userfields
  338.         next
  339.      next
  340.  
  341.      ...................FORMAT.....................
  342.  
  343.      .formfields
  344.                        { Aircraft.knownas field }
  345.  
  346.            Production { Prodn. field}    Seats  {Seats field }
  347.  
  348.                              Operated by :-
  349.  
  350.      .userfields
  351.                       { Userlist.Airline field  }
  352.      .end
  353.  
  354.  
  355.  
  356.  
  357.                                  - 5 -
  358. ................................................................................
  359.  
  360.  
  361.                              FORM DESIGN
  362.  
  363.      To start designing your forms select "Form Design" then "Design
  364.      new Form" from the menu system.  You are presented with a blank
  365.      form. Each form has four pages. To move from one page to the
  366.      next use the PgDn and PgUp keys. To move the cursor around on a
  367.      page use the arrow keys. Designing your form is a bit like
  368.      designing a form on paper. If you were to type on a paper form-
  369.  
  370.               Name     .................
  371.               Address  .................
  372.                        .................
  373.                        .................
  374.                        .................
  375.  
  376.      Then in Easy Base you type Name and Address as above but
  377.      instead of typing the dots you define fields for the data to be
  378.      entered to.
  379.  
  380.      Easy Base provides several facilities for "Polishing" the
  381.      presentation of your forms and these are covered first before
  382.      moving on to field definition.
  383.  
  384.      If you wish to enclose your text within boxes or in some
  385.      tabular format Press F3 and select "Line Drawing".  To draw
  386.      lines on the screen hold down the Alt key, The Ctrl key or both
  387.      and drive the cursor around with the arrow keys. The Alt key
  388.      draws double thin lines, the Ctrl key draws single thin lines
  389.      and a combination of both draws a thick single line. Press Esc
  390.      when you are finished line drawing to return to normal editing.
  391.  
  392.      If you wish to shade areas of the screen then again press F3
  393.      and select "Shading". Shading works much the same as Line
  394.      Drawing.
  395.  
  396.      If you require Greek, Mathematical or International characters
  397.      which cannot be typed directly from the keyboard then press F3
  398.      and select either "Greek and Mathematical" or "International" A
  399.      menu of all such characters provided by your PC will appear.
  400.      The one you select is printed to your form at the cursor
  401.      position.
  402.  
  403.      If you wish to use other than the default text colour then
  404.      press F4 after you have typed your text. In each Easy Base
  405.      screen colour set you can select one of two alternate text
  406.      colours or "Blink" - choose 1, 2 or 3 .  To change the colour
  407.      of your text or lines just hold down the shift key and drive
  408.      the cursor over the text you want to change with the arrow
  409.      keys. Press Esc when you have finished colouring your form.
  410.  
  411.      Text input in the form designer has "overtype" as the default.
  412.      If you wish to move text (or fields) to the right press the
  413.  
  414.  
  415.                                  - 6 -
  416. ................................................................................
  417.  
  418.  
  419.      Ins key. Insert mode is indicated by a block cursor and
  420.      Overtype by an underscore cursor. (This is the opposite to all
  421.      other editors in Easy Base as it keeps the underscore cursor as
  422.      the default)
  423.  
  424.      To insert a blank line above text or fields press F1. You
  425.      cannot scroll text or fields between pages in form design.
  426.  
  427.      If you need to move areas of your form then press F9, shade the
  428.      rectangle you wish to move and move it around with the arrow
  429.      keys. You can also transport the rectangle between pages with
  430.      the PgUp and PgDn keys.  F9 can also be used to erase areas of
  431.      the screen.
  432.  
  433.      When you are ready to define the data fields, position the
  434.      cursor where you want the field to start and press F10.
  435.      A window opens into which you enter all the attributes for the
  436.      field.
  437.  
  438.      The first attribute is "Field Name". If you have typed text to
  439.      the left of the field then Easy Base will have inserted this as
  440.      a default in the Field Name attribute. If it's not the name you
  441.      want just edit it. When you are happy with the field name press
  442.      return or the down arrow to the "Data Type" attribute. A menu
  443.      appears with the nine different field types. (The field types
  444.      are described fully in the Programmers Reference)
  445.  
  446.      When you have chosen a field type the cursor automatically
  447.      moves down to the "Field Length" attribute if you have chosen
  448.      "Text", "Integer", "Fixed Point" or "Floating Point" and to the
  449.      "Mandatory Entry" attribute if you have chosen one of the
  450.      others. Enter the field length you require in characters. If
  451.      you have chosen "Fixed Point" as the field type there are two
  452.      entries, one for the digits left of the decimal point and one
  453.      for the digits right of it. If your field is to hold a currency
  454.      value then the second entry will of course be 2.
  455.  
  456.      You must supply values for the first three field attributes.
  457.      The others all have preset defaults so you can save your field
  458.      at this point if none of the others have to be changed.
  459.  
  460.  
  461.      The next Field Attribute is "Mandatory Entry" which has a
  462.      default of "No".  You can set this to "Yes", "No" or "If". If
  463.      you set it to "Yes" then Easy Base will not allow a record to
  464.      be filed with this field left blank.  If you set it to "If"
  465.      then the "Code Snippet" editor opens up and you can enter the
  466.      condition under which an entry becomes mandatory. If you were
  467.      designing a "Payments" form and one of the fields "Paymethod"
  468.      could be filled with either "Cash" or "Cheque". Then the field
  469.      "ChequeNo" would have to be filled only if the "Paymethod"
  470.      field had "Cheque" entered in it.  To make an entry mandatory
  471.  
  472.  
  473.                                  - 7 -
  474. ................................................................................
  475.  
  476.  
  477.      in the "Chequeno" field only if "Paymethod" is "Cheque" enter -
  478.  
  479.      paymethod = "cheque" in the Code Snippet editor.
  480.  
  481.      When you use the Code Snippet editor for Mandatory Entry and
  482.      for User Entry, only the condition is entered :-
  483.  
  484.            total < 100
  485.            name = blank
  486.            length = blank or breadth = blank
  487.  
  488.      the "if" is assumed.
  489.  
  490.      If you set the "Mandatory Entry" attribute to either "Yes" or
  491.      "If", a window will open into which you can type the message
  492.      which you wish to be displayed should an attempt be made to
  493.      file a blank entry.  If you leave the message blank Easy Base
  494.      will supply the default message "This field must be filled !".
  495.  
  496.      The next attribute is "Unique". This can be set to "Yes" or
  497.      "no".  You can only have one unique field on a form. If you
  498.      have already defined a field as the unique field and you change
  499.      your mind and define another then Easy Base will automatically
  500.      cancel the unique attribute on the first field.  Indexing is
  501.      automatically set to "Yes" for the unique field.
  502.  
  503.      The next attribute is "Indexed". Select "Yes" or "No"
  504.      When you set "Index" to "yes",  Easy Base Creates a separate
  505.      "Index" file in which the contents of the field are kept in up
  506.      to date order. Index files are used by Easy Base in exactly the
  507.      same way that you would use an index in a book to find things
  508.      quickly.
  509.  
  510.      The next attribute is "User entry".  This has a default of
  511.      "Yes" but can be set to "No" or "If".  If you set this
  512.      attribute to "No" then the cursor will not visit the field
  513.      during record entry so the user cannot alter its contents. You
  514.      would normally set this to "No" if the contents are derived or
  515.      calculated from the values of other fields. You can set this
  516.      attribute to "If" if the value entered in another field makes
  517.      this one superfluous. For example, in the "Aircraft" form, if
  518.      you had a field "Passengers" and the type had been entered as
  519.      "Fighter" there would be no point in the cursor moving to the
  520.      "Passengers" field.  When the Code Snippet editor opens you
  521.      could type:-
  522.  
  523.            type = "Transport" or type = "Airliner"
  524.  
  525.      The next field attribute is "Display".   When the cursor
  526.      reaches this attribute a menu appears with the seven different
  527.      ways in which the field can be displayed.
  528.  
  529.  
  530.  
  531.                                  - 8 -
  532. ................................................................................
  533.  
  534.  
  535.      The field display attribute settings have the following
  536.      meaning.
  537.  
  538.      1.  FIELD
  539.  
  540.          The field's size is displayed as a block which shows
  541.          up against the screen background.
  542.  
  543.      2.  TEXT
  544.  
  545.          The field size does not show up against the screen
  546.          background and the contents are in the default text colour.
  547.  
  548.      3.  1ST ALT COL.
  549.  
  550.          As Text but with the contents in the first alternate colour
  551.  
  552.      4.  2ND ALT COL
  553.  
  554.          As Text but with contents in the second alternate colour.
  555.  
  556.      5.  BLINKING
  557.  
  558.          As Text but the contents blink.
  559.  
  560.      6.  INVISIBLE
  561.  
  562.          Neither the size nor the contents can be seen.
  563.          Invisible fields are used to hold compound index fields and
  564.          the results of intermediate calculations which the user
  565.          need not see.
  566.  
  567.      7.  CODEWORD FIELD
  568.  
  569.          The size of a codeword field shows against the screen
  570.          background but its contents are masked by stars.
  571.          Codeword fields are used to collect passwords for
  572.          restricted menus or procedures. An onlooker cannot see the
  573.          password which is being entered.
  574.  
  575.      The final field attribute is "Derived". If you set this to
  576.      "yes" then the Code Snippet editor opens and you can enter the
  577.      formula by which the fields contents are to be derived.
  578.  
  579.      In the Code Snippet editor you can enter almost any derivation
  580.      formula. Formulae consist of field names operators and
  581.      functions.
  582.  
  583.         price * markup
  584.         VATon(net,vatrate)
  585.         datetext(system date)
  586.         if(sex = male,"Mr","Ms")
  587.  
  588.  
  589.                                  - 9 -
  590. ................................................................................
  591.  
  592.  
  593.      All the operators and functions are fully described with
  594.      examples of how they are used in the Programmers Reference.
  595.  
  596.      If in the Code Snippet editor you cannot remember a field or
  597.      function name then Press F1 for the reminder lists.
  598.  
  599.      There is a cut and paste facility in the Code Snippet editor.
  600.      To mark text hold down the shift key and move the cursor with
  601.      the arrow keys. When you release the keys the "Cut" or "Copy"
  602.      choice will appear. To paste text, position the cursor at the
  603.      insertion point and press Shift + Ins.  Text which is cut or
  604.      copied from the derivation of one field can be pasted into the
  605.      derivation of any other field in any other form.
  606.  
  607.      When you have finished entering the field attributes press F2
  608.      to save the field. When you have defined all the fields press
  609.      F2 to save the form.
  610.  
  611.      There is one other facility in the Form Design editor.  If you
  612.      press F5 at any time you enter "Derivation Test Mode".  In
  613.      derivation test mode you can enter data to your fields and
  614.      check if your derivations work correctly.  Any fields which you
  615.      have defined as invisible are not hidden in test mode.  The
  616.      main advantage of test mode as opposed to testing in Record
  617.      Entry comes not when you are designing new forms but when you
  618.      wish to modify one after you have saved many records in it.  If
  619.      you add, delete or alter the length of a field then the entire
  620.      data file has to be reformatted and this takes time.  With
  621.      "Derivation Test Mode" you can ensure that the modifications
  622.      you have made are correct before reformatting.
  623.  
  624.      The only exception to test mode is if you have added a new
  625.      lookup function and you have not yet entered the relationship.
  626.      If you select test mode with a relationship missing you will
  627.      get an error message and be returned to Form Design.
  628.  
  629.      When you save your form Easy Base tests it in derivation test
  630.      mode before saving. If it cannot find a relationship you will
  631.      be given an error message and offered the choice to remain in
  632.      Form Design (which you would do should you know that the
  633.      relationship exists and you must therefore have mistyped a
  634.      lookup formula) or to save and exit anyway. (Which you would do
  635.      if the relationship had not yet been entered)
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.                                  - 10 -
  648. ................................................................................
  649.  
  650.  
  651.                  RELATIONSHIPS AND THE LOOKUP FUNCTION
  652.  
  653.      In Easy Base the Lookup Function together with pre-recorded
  654.      relationship links provide two of the most important facilities
  655.      of a data management system.
  656.  
  657.          1. Reuse of previously entered data.
  658.          2. Verification of text data.
  659.  
  660.      Consider the situation where you have designed a form to hold
  661.      information about your business's customers. The form has an
  662.      "accountno" field which has been derived as "Sequence" and this
  663.      is therefore the "Unique" field on the form.  It also has
  664.      fields "Name" and "Address".  All your customers have now been
  665.      recorded in this form.  You now want to create an invoice form.
  666.      Each invoice issued will have to have a customer's name and
  667.      address entered on it.  All the names and addresses are already
  668.      filed in Easy Base so they do not have to by typed again.
  669.      Provided that Easy Base knows which customer's name and
  670.      address is required it can copy it automatically from the
  671.      "Customers" form to the "Invoice" form.
  672.  
  673.      The way in which Easy Base accomplishes this is exactly the
  674.      same as you would accomplish the task manually in a hand
  675.      written system. If you knew where to find the book in which
  676.      your customers names had been written and you knew the
  677.      customers account number then you could find the customers name
  678.      and address.
  679.  
  680.      The only slight difference for the computer is that while you
  681.      would consider it "Obvious" that the account number on the
  682.      invoice would be the same as the account number in the
  683.      addresses book your computer does not - You have to tell it.
  684.  
  685.      To tell Easy Base where to look and that the "accountno" is the
  686.      link, you enter a record in the "Relationships" form.
  687.  
  688.      When you select "Relationships" from the main menu you will see
  689.      five fields to be filled.  The first field is the name of the
  690.      form which data is to be copied to. In this case you will enter
  691.      "Invoices".  You will notice that easy base has displayed a
  692.      list of all your form names and that you must choose one.  You
  693.      cannot enter the name freehand.  This "internal" data
  694.      verification is the same as you will be doing for your own data
  695.      later.
  696.  
  697.      The second field is for the name of the form in which the data
  698.      can be found.  In this case select "Customers".
  699.  
  700.      The next two fields record which fields in the primary and
  701.      secondary form hold the "Linking" data. In this case select
  702.      "acountno" in both.
  703.  
  704.  
  705.                                  - 11 -
  706. ................................................................................
  707.  
  708.  
  709.      The final field is the name of the relationship record.  You
  710.      will notice that Easy Base has already entered a default name
  711.      of "Customers".  The relationship name can be anything you like
  712.      but as the "Lookup" function which you are about to use quotes
  713.      the relationship name as its first parameter and the field to
  714.      be copied as its second then Lookup(customers,name) has to be
  715.      more meaningful and easy to remember than any other name you
  716.      could give.
  717.  
  718.      When you have entered all the fields press F2 to save the
  719.      relationship, return to Form Design and load your "Invoice"
  720.      form.
  721.  
  722.      All that remains to do now is edit the field attributes of the
  723.      "Name" and "address" fields.  To edit a field you can either
  724.      press F10 with the cursor on the form background and select the
  725.      field to edit by name, or you can position the cursor within
  726.      the field you wish to edit and then press F10, in which case
  727.      the field attribute window will open automatically.  Position
  728.      the cursor in the "Name" field and press F10. Move the cursor
  729.      to the "Derivation" attribute and set it to yes. (you can move
  730.      the cursor from the "Name" attribute directly to the "Derived
  731.      attribute by pressing the up arrow)
  732.  
  733.      When the Code Snippet window opens type -
  734.  
  735.           Lookup(customers,name)
  736.  
  737.      and press F2.  If you had not already done so then set the
  738.      "User Entry" attribute to "No".
  739.  
  740.      Press F2 to save the new field attributes and then do the same
  741.      for the "Address" field, this time entering the derivation -
  742.  
  743.          Lookup(customers,address)
  744.  
  745.      To test that you have typed the lookups correctly press F5 for
  746.      Derivation Test Mode. Enter a customers account number in the
  747.      "Acountno" field and press the return key. If your formulae are
  748.      correct the customers name and address will appear in the
  749.      "Name" and "Address" fields.
  750.  
  751.      In this example you have performed two "Secondary" lookups.
  752.      Both the "Name" and "Address" fields were found using the
  753.      "accountno" link which you had to enter correctly in order
  754.      to find the other two fields.
  755.  
  756.      The real power of the Lookup function is only realized when you
  757.      perform "Primary" and "Secondary" lookups.  In a "Primary"
  758.      lookup the field whose value is to be looked up is also the
  759.      "Link".  It is "Primary" lookups which are used for data
  760.      integrity checking.
  761.  
  762.  
  763.                                  - 12 -
  764. ................................................................................
  765.  
  766.  
  767.      Consider the "Aircraft" and "Manufacturers" forms which were
  768.      discussed earlier.  Suppose that you want to lookup the
  769.      manufactures name and the name of his base airfield into the
  770.      "Aircraft" form.  The definition field in the "Manufacturers"
  771.      form is "Name" - There is no handy "accountno".  You are going
  772.      to have to enter a relationship between "Aircraft" and
  773.      "Manufacturers" linking the two fields "Manufacturer" in the
  774.      "Aircraft" form with "Name" in the "Manufacturers" form.
  775.  
  776.      Having done this you could derive the "Base" field in the
  777.      "Aircraft" form with - Lookup(manufacturers,base) - and it
  778.      would be looked up when you entered the manufacturers Name just
  779.      as in the invoice example.  But what of the "Manufacturers"
  780.      field itself.  Was the name you entered in the manufacturers
  781.      form "A.V.Roe", "A.V.Roe & Co." or "AVRO A/C Co.".
  782.  
  783.      Easy Base provides a simple solution to this problem.
  784.  
  785.      Having entered the relationship, return to Form design and
  786.      enter the lookup derivations. Derive the "Base" field with -
  787.  
  788.          Lookup(manufacturers,base)
  789.  
  790.      and the "Manufacturers" field with
  791.  
  792.          Lookup(manufacturers,name)
  793.  
  794.      This time, leave the "User Entry" attribute set to "Yes" in the
  795.      "Manufacturers" field.
  796.  
  797.      Press F5 for "Test mode".  When the cursor enters the
  798.      "Manufacturers" field type -  AV*  - and press return.
  799.  
  800.      Provided there is only one manufacturer whose name begins with
  801.      "AV" the Avro name will be looked up into the "Manufacturers"
  802.      field and its representation will always be exactly the same as
  803.      the original entry in the "Manufacturers" form.  If there are
  804.      several manufacturers whose names begin with "AV" then a menu
  805.      will appear listing all of them and you can choose the one you
  806.      want. As soon as you select the name the secondary lookup
  807.      "Base" will fill automatically.
  808.  
  809.      If you cannot remember the first letters of the name you want
  810.      to look up - say for example that you could only remember that
  811.      "Roe" was in the name - then type Roe* and press return.  If
  812.      any manufacturers names begin with "Roe" they will be displayed
  813.      first. If not Easy Base will fill the "Manufacturer" field with
  814.      the first name it finds with the letters roe in it.  If this is
  815.      not the one you want press F3.  Each time you press F3 Easy
  816.      Base will find the next name containing the letters until you
  817.      find the one you want.   As a final resort - if you really
  818.      can't remember what you are looking for - just enter an "*" on
  819.  
  820.  
  821.                                  - 13 -
  822. ................................................................................
  823.  
  824.  
  825.      its own and press return. Easy Base will then list all the
  826.      manufacturers names for you to choose from.
  827.  
  828.      There is no limit to the number of secondary lookups which can
  829.      be made from each primary and there is no limit to the number
  830.      of different forms you can look data up from.
  831.  
  832.      If you have many different forms which all look up data from
  833.      the "Customers" form then they can all use the same
  834.      relationship name "Customers" but if you have more than one
  835.      relationship between the same two forms then they must have
  836.      different names.
  837.  
  838.      If you had a "Stock" form with the unique field "Item" and
  839.      another field "Price" then you could add four fields to your
  840.      "Invoice" form - "Item", "Quantity" "Price" and "Total".
  841.  
  842.      You would enter a relationship "Stock" between "Invoice" and
  843.      "Stock" with the related fields being "Item" in both forms.
  844.  
  845.      In your invoice form you would derive :-
  846.  
  847.         Item as    Lookup(stock,item)
  848.         Price as   Lookup(stock,price)
  849.         Total as   quantity * price
  850.  
  851.      When you entered the "Item" field (primary lookup) the price
  852.      field would fill automatically and when you entered the
  853.      "Quantity" the "Total" field would be calculated.
  854.  
  855.      However, if you now add four more fields "Item2", "Price2",
  856.      "Quantity2" and "Total2" you will need another relationship
  857.      between "Invoice" and "Stock" this time linking "Item2" in the
  858.      "Invoice file" with "Item" in the stock file and you cannot now
  859.      use the default name "Stock" for the relationship.
  860.  
  861.      Although you can give your additional relationship any name you
  862.      like, the best name will be "Stock2".
  863.  
  864.      Please note that this example is used purely to show the use of
  865.      multiple relationships between the same two forms.  If you are
  866.      intending to write an invoicing system then unless you know
  867.      that there will only be a limited number of items on each
  868.      invoice this is not a practical way to tackle the problem.
  869.  
  870.      In a flexible invoicing system each item and quantity is
  871.      entered via a procedure to a temporary list form whose contents
  872.      are then printed to the invoice.
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.                                  - 14 -
  880. ................................................................................
  881.  
  882.  
  883.                                DATA ENTRY
  884.  
  885.      As soon as you have designed forms you can enter and view data
  886.      directly using the default screen you created.  To enter data
  887.      to a form select "Data Entry" from the main menu and choose the
  888.      form you wish to use.
  889.  
  890.      Your default entry screen will appear with the cursor in the
  891.      top left field. The top line of the screen shows the name and
  892.      page number of the form you are using together with the system
  893.      date and time. Line 2 shows the number of the record you are
  894.      creating or editing on the left hand side. It is also the line
  895.      on which any error messages are passed. The bottom line lists
  896.      the most used function keys and is also the line on which help
  897.      prompts are displayed.
  898.  
  899.      To move the cursor around between fields you can use all of the
  900.      cursor control keys which work as follows:-
  901.  
  902.      The Return key moves from field to field in the order top left
  903.      to bottom right unless you have overridden this in form design
  904.      by deriving fields with "Goto (fieldname) Next".
  905.  
  906.      The Tab key moves the cursor from field to field in the order
  907.      bottom right to top left (reverse of Return).
  908.  
  909.      The arrow keys move the cursor in the direction indicated.
  910.  
  911.      The Home Key moves the cursor to the beginning of the current
  912.      field if it is not already there and to the first field on the
  913.      page if it is.
  914.  
  915.      The End Key moves the cursor to the end of text if it is in a
  916.      text field and to the last field on the page if it is not.
  917.  
  918.      The PgUp and PgDn Keys move between pages if your form has more
  919.      than one.
  920.  
  921.      When you have entered the data for your first record press F2
  922.      to save it to disk. The screen will clear, the message "Record
  923.      1 has been added" will appear briefly on line two and you will
  924.      be ready to enter the next record.
  925.  
  926.      If some of your fields are primary lookups then you use them
  927.      exactly the same as was described for "Derivation Test Mode" by
  928.      entering part of the text followed by a star and pressing the
  929.      Return Key.
  930.  
  931.      Once you have saved a few records to disk you may wish to view
  932.      or edit them. You can bring previously entered records back to
  933.      the screen for editing in several ways.  From record creation
  934.      the F5 Key brings up the first record and subsequent presses
  935.  
  936.  
  937.                                  - 15 -
  938. ................................................................................
  939.  
  940.  
  941.      bring up the next record. Similarly, from record creation the
  942.      F4 Key brings up the last record and subsequent presses bring
  943.      up the previous record.
  944.  
  945.      Once you have entered several records this process becomes
  946.      impracticable and you "search" for the record you wish to view
  947.      or edit.  Position the cursor in any field and type part of the
  948.      field contents you wish to search for followed by a star and
  949.      press F3.
  950.  
  951.      Searching for records within a form is a similar process to
  952.      looking up data except that you press the F3 rather than the
  953.      Return Key to initiate the process. If the field in which you
  954.      are searching is indexed and more than one record matches the
  955.      data you have entered then Easy Base will make a list of all
  956.      the field contents which match for you to choose from.  If the
  957.      field is not indexed then Easy Base will bring up the first
  958.      record it finds a match in. If this is not the record you want
  959.      then press F3 again. Easy Base will find another match on each
  960.      successive press of the F3 key until you find the record you
  961.      want. As with lookups, Easy Base will search for "Part Matches"
  962.      after it has exhausted all the records where the entered data
  963.      matches the beginning of the field and if you enter a star on
  964.      its own and press F3, Easy Base will list all the field
  965.      contents for you to choose from.
  966.  
  967.      When you have brought a previously entered record back to the
  968.      screen you will notice that line 2 now displays "Editing Record
  969.      x of y " rather than "Creating New Record x ".  Easy Base
  970.      automatically changes from "Create" to "Edit" mode when you
  971.      view a record.  The changes which you make on screen are not
  972.      entered to the record on disk until you press F2.
  973.  
  974.      To clear the contents of the field in which the cursor lies
  975.      rather than delete each character press F6. To return to
  976.      "Create" mode press F6 twice.
  977.  
  978.      Not all of the active function keys are listed on the prompt
  979.      line. To see a full menu of the function key uses press F1 for
  980.      the Function Key Menu.  The following is a summary of the
  981.      function key usage in Data Entry:-
  982.  
  983.      F1
  984.  
  985.      The F1 Key brings up the function key Menu.
  986.  
  987.      F2
  988.  
  989.      The F2 Key writes a new record from "Create" and updates the
  990.      record on screen from "Edit" mode.
  991.  
  992.  
  993.  
  994.  
  995.                                  - 16 -
  996. ................................................................................
  997.  
  998.  
  999.      F3
  1000.  
  1001.      The F3 key initiates searches for previously entered records
  1002.      based on the data entered in the current field.
  1003.  
  1004.      F4
  1005.  
  1006.      The F4 key moves to the previous record when in "Edit" mode and
  1007.      to the last record from "Create" mode.
  1008.  
  1009.      F5
  1010.  
  1011.      The F5 Key Moves to the next record when in "Edit" mode and to
  1012.      the first record from "Create" mode.
  1013.  
  1014.      F6
  1015.  
  1016.      The F6 key clears the current field on the first press and
  1017.      returns you to "Create" mode on the second press.
  1018.  
  1019.      F7
  1020.  
  1021.      The F7 key deletes the record currently on screen in "Edit"
  1022.      mode.  When you delete a record with the F7 key it is not
  1023.      actually erased from the disk. It is simply "Flagged" for
  1024.      deletion at the next "Pack" operation. If you delete a record
  1025.      accidentally you can reinstate it any time before the form is
  1026.      next packed.
  1027.  
  1028.      F8
  1029.  
  1030.      The F8 key creates a new record by copying the record currently
  1031.      on screen. If a new record you wish to create contains similar
  1032.      data to one already entered then you can find the previous
  1033.      entry, change the unique field and copy it with F8 rather than
  1034.      type it all again.
  1035.  
  1036.      F9
  1037.  
  1038.      If you know the number of the record you wish to view or edit
  1039.      you can press F9 and enter the record number. Easy Base will
  1040.      then bring the record whose number you have entered to the
  1041.      screen.
  1042.  
  1043.      F10
  1044.  
  1045.      When you press the F10 key Easy Base searches for records which
  1046.      are "Flagged" for deletion.  When it finds one it will bring it
  1047.      to the screen. You can reinstate a deleted record by pressing
  1048.      F2 while it is on screen. The F5 key searches for the next
  1049.      deleted record and the Escape key returns you to "Live
  1050.      Records".
  1051.  
  1052.  
  1053.                                  - 17 -
  1054. ................................................................................
  1055.  
  1056.  
  1057.      F11
  1058.  
  1059.      If you have been viewing records and you wish to return to one
  1060.      which you had on screen earlier then press F11 and Easy Base
  1061.      will back step through the records you have viewed.
  1062.  
  1063.      F12
  1064.  
  1065.      The F12 key brings up the form's "Options". There are four
  1066.      options in Data Entry.
  1067.  
  1068.         1. Clear screen on Adding Record.             (Default Yes)
  1069.         2. Confirmation Required to delete Records.   (Default Yes)
  1070.         3. Confirmation Required to abandon Edits     (Default No)
  1071.         4. Clear Field on Editing                     (Default No)
  1072.  
  1073.      If you change "Clear Screen on adding Record" to "No" then,
  1074.      when you press F2 to file a new record, the data which is
  1075.      written to disk remains on screen ready for the next new
  1076.      record. This is useful if you are entering several records and
  1077.      many of the fields in each record contain the same data. You
  1078.      only have to overwrite the fields which are different each
  1079.      time.
  1080.  
  1081.      If you have many records to delete then set option 2 to "No"
  1082.      and you will be able to delete them without having to confirm
  1083.      each one.
  1084.  
  1085.      If you set option 3 to "Yes" then Easy Base will ask you to
  1086.      confirm that you wish to leave a record which you have edited
  1087.      but not updated to disk.
  1088.  
  1089.      If you set option 4 to "Yes" then Easy Base will clear the
  1090.      old contents of any field you start to edit.  This is most
  1091.      useful when used in conjunction with option 1. You can file a
  1092.      record, retain the contents for the next record and when you
  1093.      edit the fields which are different you do not have to first
  1094.      delete the data in them.
  1095.  
  1096.      The options you set for any given form remain with it until
  1097.      changed. They do not revert to the defaults when your computer
  1098.      is turned off and each form can have different option settings.
  1099.  
  1100.      Ctrl + E
  1101.  
  1102.      If you press the "E" key while holding down the Ctrl key you
  1103.      will get the extended "Greek" and "International" characters
  1104.      menu which was discussed in form design.
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.                                  - 18 -
  1112. ................................................................................
  1113.  
  1114.  
  1115.      Ctrl + S
  1116.  
  1117.      If you press The "S" key while holding down the Ctrl key you
  1118.      start the Spell-checker.  The Spell-checker will check the
  1119.      current field. If it finds a word not included in the Easy base
  1120.      dictionary it will offer you the choices to leave the word and
  1121.      continue, add the word to the dictionary, or choose one of the
  1122.      suggestions for replacement.
  1123.  
  1124.      The Spell checker does not automatically move from field to
  1125.      field but once you have started it, it remains active and will
  1126.      immediately check the next text field you move the cursor to.
  1127.  
  1128.      The Spell-checker is cancelled if you press the Escape key or
  1129.      if you press the F2 key to update the record.
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162.  
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.                                  - 19 -
  1170. ................................................................................
  1171.  
  1172.  
  1173.                         PROCEDURES (REPORTING)
  1174.  
  1175.      The Easy Base procedure generator is the means by which you
  1176.      manipulate and report on your data.
  1177.  
  1178.      Each procedure has at least one part, the procedure code.  The
  1179.      procedure code contains the instructions you write to tell Easy
  1180.      Base what you want done.
  1181.  
  1182.      If your procedure has an "output", in other words your
  1183.      instructions tell Easy Base to send data to the screen or to
  1184.      the printer, then the procedure must also have an Output
  1185.      Format. The Output Format is where you show Easy Base how you
  1186.      want the data you are about to "output" arranged on the screen
  1187.      or page.
  1188.  
  1189.      If what your procedure is to do depends on variables, ie it
  1190.      requires information from the operator or from Looked up data
  1191.      from one or more of your forms then it also requires an "Input
  1192.      Screen".  The Input Screen is where you gather the variable
  1193.      information that your procedure needs in order to carry out its
  1194.      task.
  1195.  
  1196.      Select "procedures" from the main menu and have a look at the
  1197.      items on the procedures menu.
  1198.  
  1199.      You will notice that the menu has pre-selected item 2 "Load
  1200.      Existing Procedure". Other than your first procedure this is
  1201.      the most useful starting point.  Item 1, "Create New Procedure"
  1202.      is only required if you wish to start a new procedure after you
  1203.      have another one loaded. The three parts to a procedure
  1204.      mentioned above are created and edited at items 3,4 and 5.
  1205.  
  1206.      Procedures, like forms, are saved to disk and can be re-used
  1207.      repeatedly. Item 6 runs the current procedure and item 7 saves
  1208.      it to disk.
  1209.  
  1210.      Item 8 deletes procedures which are no longer required and Item
  1211.      9 copies an existing procedure. Often you will require a
  1212.      procedure which is similar to one you have already created. It
  1213.      is much quicker to copy the first procedure and then edit it
  1214.      than to start a new procedure from scratch.
  1215.  
  1216.      Item 10 recalls the last output from a procedure to the screen.
  1217.      If you need to see the output from a procedure but it is not
  1218.      imperative that you have the most up to date information,
  1219.      (close of business / month end figures Etc) then it is much
  1220.      quicker to view the last output than to re-run the procedure.
  1221.  
  1222.      Finally, a small window just below the menu shows the name of
  1223.      the currently loaded procedure. In this case it is "Untitled".
  1224.  
  1225.  
  1226.  
  1227.                                  - 20 -
  1228. ................................................................................
  1229.  
  1230.  
  1231.      If you have not already done so, read the descriptions of the
  1232.      Declare, For..Next, If..Then, Print and Printer Control
  1233.      commands in the Programmers Reference now. These are the basis
  1234.      of all "reporting" procedures and should be thoroughly
  1235.      understood. If you are a programming beginner then some of the
  1236.      examples in the For..Next section may seem a bit advanced -
  1237.      Just ignore them - for the moment it is only important that you
  1238.      understand the principle of the loop and the qualifications
  1239.      that can be applied to it.
  1240.  
  1241.      Now select item 4 to write your first Procedure Code.
  1242.      The next few pages will describe simple reporting procedures
  1243.      based on the "Aircraft" form. To write like procedures for the
  1244.      forms you have designed all you have to do is substitute your
  1245.      form and field names.
  1246.  
  1247.      Before you start, have a look at the function key list on the
  1248.      bottom line. F2 saves your code and checks it. If you press the
  1249.      Escape key your code is still saved but the checking routine is
  1250.      bypassed. If you have written code and find that it is not
  1251.      passed on F2 because, for example, one of your form fields
  1252.      needs to be indexed, then you can still save the code you have
  1253.      written while you modify the form.
  1254.  
  1255.      F3 and F4 provide search and replace facilities similar to a
  1256.      word processor.
  1257.  
  1258.      There is a cut and paste system.  To mark code for cutting or
  1259.      copying hold down the Shift key and shade the code with the
  1260.      arrow keys.  As soon as you release the keys a menu will pop up
  1261.      with three options - Cut, Copy or Indent. The cut and copy
  1262.      options work exactly the same as in the Code Snippet editor
  1263.      with Shift + Ins used to paste the text. If you select "Indent"
  1264.      then you can indent all the selected lines at once with the
  1265.      left and right arrow keys.
  1266.  
  1267.      If you want to print out your code then press F10.
  1268.  
  1269.      The F1 key, labelled "Help" is the key you use when you can't
  1270.      remember something.  It has all the names of your forms, the
  1271.      names of the fields in each form and the names of all Commands,
  1272.      functions, and System values.  If Easy Base recognizes the
  1273.      context of your procedure when you press F1 then it will list
  1274.      the names you need (Formnames, fieldnames or Commands). If not
  1275.      a menu will appear from which you can pick which you need.
  1276.  
  1277.      With the cursor at the start of the top line on your blank
  1278.      procedure screen press F1.
  1279.  
  1280.      The "Commands" reminder list appears on the right hand side of
  1281.      the screen.  The command you want is the first one , "Declare
  1282.      Output Fields" but before selecting it have a look at how to
  1283.  
  1284.  
  1285.                                  - 21 -
  1286. ................................................................................
  1287.  
  1288.  
  1289.      select from the reminder lists. There are over fifty commands
  1290.      on this list but only the first seventeen are shown. You can
  1291.      scroll though them with the arrow keys but you can also use the
  1292.      inbuilt alphabetic search facility. If you type "o" then the
  1293.      highlight bar will move directly to the "Odd Page Print"
  1294.      command.
  1295.  
  1296.      Take the highlight bar back to the "Declare Output Fields"
  1297.      command either by scrolling or by pressing the Home key and
  1298.      press return.  The command will be inserted on the first line,
  1299.      the cursor will move to the second line and the "Forms"
  1300.      reminder list will appear.  Select the form which you wish to
  1301.      report on. In my example case this will be "Aircraft".
  1302.      "Aircraft." is inserted on the second line and the "fields"
  1303.      reminder list appears. I select "Knownas".  I also wish to list
  1304.      the aircraft's mark and type so I write.
  1305.  
  1306.      Declare output fields
  1307.         Aircraft.knownas : Aircraft.mark : Aircraft.type
  1308.      end
  1309.  
  1310.      Declare the fields you wish to list either by typing them
  1311.      freehand or by pressing F1 for reminders.
  1312.  
  1313.      Now complete your procedure code:-
  1314.  
  1315.      Declare Output fields
  1316.         Aircraft.knownas : Aircraft.mark : Aircraft.type
  1317.      end
  1318.      for Aircraft
  1319.         Print list items
  1320.      next
  1321.  
  1322.      and press F2 to check and save the code.
  1323.  
  1324.      If you have typed everything correctly you will be returned to
  1325.      the Procedures menu.  If you have misspelled something then the
  1326.      line with the error will be highlighted and you will get an
  1327.      error message. Correct the error and press F2 again.
  1328.  
  1329.      Easy Base now knows that it is to list the three fields
  1330.      Knownas, Mark and Type from all the records in the "Aircraft"
  1331.      form.  It does not know how they are to be arranged or whether
  1332.      they are to be printed or just shown on screen. This
  1333.      information must now be recorded on the procedures "Output
  1334.      Format".
  1335.  
  1336.      Select item 5, "Output Format", from the procedures menu and
  1337.      have a look at the screen. As usual the bottom line shows the
  1338.      function key usage. To insert a blank line you use F1 as in
  1339.      form design. F2 saves the format and the Escape Key abandons
  1340.      it. F3 gives you a line drawing facility similar to that in
  1341.  
  1342.  
  1343.                                  - 22 -
  1344. ................................................................................
  1345.  
  1346.  
  1347.      form design and Ctrl + "E" brings up the Greek and
  1348.      International characters menu.  The F10 Key is used to place
  1349.      your output fields.
  1350.  
  1351.      The upper status line shows the paper size you have selected at
  1352.      the left hand edge. If you scroll to the right it also shows
  1353.      where the right hand edge of your paper will be at the three
  1354.      different print sizes 10, 12, and 17 characters per inch.
  1355.  
  1356.      On the right hand side of the screen a small menu will have
  1357.      appeared offering you a choice of Format Section names. You do
  1358.      not have to use one of these they are just to save you time.
  1359.      For the moment select "List Items" from this menu.
  1360.  
  1361.      .List items  will appear on the first line and the cursor will
  1362.      move to the second.  For a first procedure we will simply list
  1363.      the fields required in columns. To do this move the cursor in
  1364.      along the second line to leave a reasonable margin and press
  1365.      F10 to place the first field.  A menu appears listing the three
  1366.      fields which were declared in the procedure's code. I select
  1367.      "Aircraft.knownas".  As soon as The field has been selected a
  1368.      window opens showing the default type and length of the field.
  1369.      You can change these defaults if you wish the printed length or
  1370.      type(for numeric fields) to be different in the report to what
  1371.      it is in the form. This window also presents an extra attribute
  1372.      marked "Trim Trailing Spaces" which defaults to "No". If you
  1373.      set this to "Yes" then any blanks at the beginning or end of
  1374.      the fields contents will not be printed at run time. This
  1375.      facility is used mainly for inserting numbers or names into
  1376.      form letter text.
  1377.  
  1378.      Press F2 to accept the defaults. The area which the field will
  1379.      occupy is shown on screen. Now move the cursor to the right and
  1380.      place the other two fields. Finally, press the return key to
  1381.      take the cursor to a new line and type a full stop ".".  The
  1382.      section names menu appears again.  This time select "End".
  1383.  
  1384.      The format screen now looks like this.
  1385.  
  1386.      .List Items
  1387.           ██████████████    ████████████   ████████████
  1388.      .End
  1389.  
  1390.      Press F2 to save the format. When you do, a new menu will pop
  1391.      up with four choices for the output destination. The exact
  1392.      meanings of these selections will be discussed shortly.  For
  1393.      the moment select "Output to Screen". When the Procedures menu
  1394.      appears select item 7 and save your procedure to disk.
  1395.  
  1396.      Now select item 6 and run the procedure.
  1397.  
  1398.      The fields from each record of the "Aircraft" form are listed
  1399.  
  1400.  
  1401.                                  - 23 -
  1402. ................................................................................
  1403.  
  1404.  
  1405.      down the screen. When the list reaches the bottom line the
  1406.      screen starts to scroll.  When all records have been listed the
  1407.      screen returns to the start of the list from where you can
  1408.      browse the report. If the list is long you can pause the output
  1409.      by pressing the return key while it is still running. Once the
  1410.      report is complete you can browse through it using the PgUp,
  1411.      PgDn and arrow keys.  You can also use the text search facility
  1412.      at F3.
  1413.  
  1414.      When you have finished reading the report press Escape to
  1415.      return to the procedures menu.  You can browse the report again
  1416.      at any time by selecting item 10 (Recall Last Output). Try it
  1417.      now.  While browsing a report you can also print it out by
  1418.      pressing F10.  If you press F10 to print a report from browse
  1419.      mode you invoke a low level print driver which prints the
  1420.      report at 10 CPI, 6 LPI in draft mode. Other font sizes and
  1421.      effects such as Bold and Underline are only available when you
  1422.      direct the report output to the printer at run time.
  1423.  
  1424.      To try printer effects select "Edit Procedure Code" and change
  1425.      The code to:-
  1426.  
  1427.      Declare output fields
  1428.         Aircraft.knownas : Aircraft.mark : Aircraft.type
  1429.      end
  1430.      Bold on
  1431.      12 CPI
  1432.      for aircraft
  1433.         print list items
  1434.      next
  1435.  
  1436.      Save the new code and select "Edit Output Format". There is
  1437.      nothing to change in the format itself but when you press F2 to
  1438.      save it, this time choose "Choose at Run time" for the output
  1439.      destination.
  1440.  
  1441.      When you now select "Run Procedure", the computer will beep and
  1442.      you will be asked whether the output is to be to the screen or
  1443.      printer. Choose printer and easy base will print your report in
  1444.      bold at 12 characters to the inch. (Assuming you have installed
  1445.      the correct printer driver from the utilities menu)
  1446.  
  1447.      You will notice that while Easy Base was printing your report
  1448.      it also output it to the screen but on completion it returned
  1449.      you to the procedures menu without invoking Browse mode.
  1450.  
  1451.      The output destinations which you choose when saving the output
  1452.      format are not "Either or" choices.  Irrelevant of your choice
  1453.      the output is always sent to both the screen and the disk file.
  1454.      It is the disk file that you browse when you select "Recall
  1455.      Last Output".  The differences between the choices are that
  1456.      only an output to the screen invokes Browse mode on completion
  1457.  
  1458.  
  1459.                                  - 24 -
  1460. ................................................................................
  1461.  
  1462.  
  1463.      and only an output to printer prints the report. Output to disk
  1464.      is only selected if you want to update reports from a Batch
  1465.      Execute menu.
  1466.  
  1467.      Now let's try something a bit more interesting. So far the
  1468.      report simply lists the aircraft in the order in which the
  1469.      records were filed.  To list them in alphabetic order, edit the
  1470.      procedure code and change the "For" line to:-
  1471.  
  1472.      for aircraft with knownas in order
  1473.  
  1474.      Save the code.  Easy Base can only list in order if the field
  1475.      you wish the order to be done by is indexed.  If the field you
  1476.      have chosen is not indexed you will get an error message.  If
  1477.      this happens, save the code by pressing the Escape Key - Save
  1478.      the procedure at item 7 then return to form design.  Load your
  1479.      form - edit the attributes for the field changing Indexed to
  1480.      "Yes".
  1481.  
  1482.      You can now reload your procedure and run it. This time the
  1483.      aircraft names will be in alphabetic order.
  1484.  
  1485.      Because a procedure has up to three parts it may not at this
  1486.      stage be obvious how Easy Base is handling the "Saving" or
  1487.      "Abandoning" of separate parts.  Here is a quick explanation.
  1488.      If you escape from either the output format or later the input
  1489.      screen and choose to "abandon" it you are abandoning it in the
  1490.      version of the report you are editing only. If you escape from
  1491.      the procedures menu and choose to "abandon" the procedure then,
  1492.      if it is a new "Untitled" procedure it is lost but if it is a
  1493.      procedure which you have loaded for editing then it is only the
  1494.      edits which are abandoned - The original procedure remains
  1495.      unchanged on disk. A procedure which you have loaded for
  1496.      editing is only changed on disk when you save it with item
  1497.      seven from the procedures menu.  At any time during the editing
  1498.      of a procedure you can throw away all your edits and return to
  1499.      the original version by reloading it from disk and replying
  1500.      "No" when you are asked if you wish to save the currently
  1501.      loaded version.
  1502.  
  1503.      Suppose now that we wished to list the aircraft in groups by
  1504.      type - all the bombers together - all the fighters together
  1505.      Etc.
  1506.  
  1507.      To do this, edit the procedure code again and change the "For"
  1508.      line to: -
  1509.  
  1510.      for aircraft with type in order
  1511.  
  1512.      This time, when the report is run, all the airliners come first
  1513.      followed by the bombers etc. but the group field "Airliner" ,
  1514.      "Bomber" etc. is listed on each line and it would be much
  1515.  
  1516.  
  1517.                                  - 25 -
  1518. ................................................................................
  1519.  
  1520.  
  1521.      neater if it could be separated or printed in Bold or
  1522.      underline.
  1523.  
  1524.      Edit the code again, this time to:-
  1525.  
  1526.      Declare output fields
  1527.         Aircraft.knownas : Aircraft.mark : Aircraft.type
  1528.      end
  1529.      declare variables
  1530.        lasttype as text
  1531.      end
  1532.      for Aircraft with type in order
  1533.         if aircraft.type <> lasttype then print group header
  1534.         lasttype = aircraft.type
  1535.         print list items
  1536.      next
  1537.  
  1538.      In this code we have introduced a text variable "lasttype".
  1539.      During the "For" loop the list items will be printed on each
  1540.      iteration but the group header will only be printed when the
  1541.      type changes
  1542.  
  1543.      Now edit the output format to:-
  1544.  
  1545.      .group header
  1546.  
  1547.          ████████████████
  1548.      .list items
  1549.                  ███████████████     ██████████████
  1550.      .end
  1551.  
  1552.      The group header starts with a blank line which will separate
  1553.      the groups. It contains only the "Type" field.  The list items
  1554.      section contains the "Knownas" and mark fields.
  1555.  
  1556.      When you run this report the output will be:-
  1557.  
  1558.         Airliners
  1559.                 Boeing 707
  1560.                 Dehaviland Comet     Mk4
  1561.                 Boeing Jumbo Jet     747
  1562.  
  1563.         Bombers
  1564.                 Boeing B52
  1565.                 Avro Vulcan
  1566.                 Avro lancaster       2
  1567.  
  1568.  
  1569.      If you want the group header to be in bold or underline then
  1570.      all you have to do is insert the on and off commands before and
  1571.      after the "Print group header" command using the block If then
  1572.      construction.
  1573.  
  1574.  
  1575.                                  - 26 -
  1576. ................................................................................
  1577.  
  1578.  
  1579.      Declare output fields
  1580.         Aircraft.knownas : Aircraft.type : Aircraft.mark
  1581.      end
  1582.      declare variables
  1583.         lasttype as text
  1584.      end
  1585.      for Aircraft with type in order
  1586.         if aircraft.type <> lasttype then
  1587.            bold on : underline on
  1588.            print group header
  1589.            bold off : underline off
  1590.         end if
  1591.         print list items
  1592.      next
  1593.  
  1594.      As a beginner, you are probably wondering about the reason for
  1595.      the indentations after the "for" and "if" lines. The code will
  1596.      work perfectly well without them. When you come to write more
  1597.      advanced procedures you will have many For loops, Do Loops and
  1598.      If conditions interwoven with each other.  If each has its own
  1599.      indentation then you will be able to see at a glance which
  1600.      commands occur within which loops and conditions and your code
  1601.      will be very easy to read and edit.
  1602.  
  1603.      Going back to the "Aircraft" listing procedure, we now have
  1604.      each group separated but the aircraft names themselves are no
  1605.      longer in alphabetic order.  This is because we changed index
  1606.      files when we selected "With Type in order".  It is now the
  1607.      "Type" groupings which are in alphabetic order.  Suppose that
  1608.      we want to keep this grouping but still list the aircraft in
  1609.      each group with their names in order.  Neither of the index
  1610.      files on the "Knownas" or "Type" fields can produce this order.
  1611.      We need a combined or "Compound" index on both fields
  1612.  
  1613.      To construct this index, save the present procedure and return
  1614.      to form design.  Load the "Aircraft" form and add a new field
  1615.      anywhere on it. Assuming the length of the "Knownas" field as
  1616.      20 and the length of the "Type" field as 15 the new fields
  1617.      attributes are:-
  1618.  
  1619.      Name         Typename
  1620.      Type         Text
  1621.      Length       35
  1622.      Mandatory    No
  1623.      Unique       No
  1624.      Indexed      Yes
  1625.      User Entry   No
  1626.      Display      Invisible
  1627.      Derived      Yes
  1628.  
  1629.      The derivation formula is:-
  1630.      Jointext(spacepad(category,15),knownas)
  1631.  
  1632.  
  1633.                                  - 27 -
  1634. ................................................................................
  1635.  
  1636.  
  1637.      Test that the derivation formula is correct by pressing F5 for
  1638.      test mode. When you type a name into the "Knownas" field and a
  1639.      type in the "Type" field the new field should derive as a
  1640.      combination of the two.
  1641.  
  1642.      Escape from test mode and press F2 to save the form. Easy Base
  1643.      will first re-format the data file to incorporate the new field
  1644.      and then write the new index file.
  1645.  
  1646.      When this is complete, return to the procedure and edit the
  1647.      "For line of the code from:-
  1648.  
  1649.      For aircraft with type in order
  1650.  
  1651.      to
  1652.  
  1653.      For Aircraft with typename in order
  1654.  
  1655.      No change is necessary to the output format.  The output will
  1656.      be laid out as before but the names in each group will be in
  1657.      alphabetic order.
  1658.  
  1659.      To "Polish" the "Aircraft" report it would be nice if it had a
  1660.      heading. We would also like to prevent the list from running
  1661.      off the end of the page when printed and add a page number at
  1662.      the foot of each page.
  1663.  
  1664.      To do these things edit the code to:-
  1665.  
  1666.      Declare output fields
  1667.         Aircraft.knownas : Aircraft.type : Aircraft.mark
  1668.         page number                  'New Field
  1669.      end
  1670.      Declare variables
  1671.         lasttype as text
  1672.      end
  1673.      bold on
  1674.      print report header
  1675.      for aircraft with typename in order
  1676.         if bottom margin < 1 then
  1677.            bold on : print page footer
  1678.            page feed : print page header : bold off
  1679.         end if
  1680.         if aircraft.type <> lasttype then
  1681.            bold on : underline on
  1682.            print group header
  1683.            bold off : underline off
  1684.         end if
  1685.         print list items
  1686.      next
  1687.      print report footer
  1688.  
  1689.  
  1690.  
  1691.                                  - 28 -
  1692. ................................................................................
  1693.  
  1694.  
  1695.      Now edit the output format to:-
  1696.  
  1697.      .Report header
  1698.          ════════════════════════════════════════════════════
  1699.                      AIRCRAFT LIST BY TYPE
  1700.          ────────────────────────────────────────────────────
  1701.      .Group Header
  1702.  
  1703.          ████████████████
  1704.      .List Items
  1705.                  ████████████████     ██████████████████
  1706.      .Page header
  1707.          ════════════════════════════════════════════════════
  1708.                   Aircraft List By Type (Cont)
  1709.          ────────────────────────────────────────────────────
  1710.      .Page Footer
  1711.  
  1712.                              - ██ -
  1713.      .Report Footer
  1714.          ════════════════════════════════════════════════════
  1715.      .End
  1716.  
  1717.      The new print sections Report Header, Report Footer, and Page
  1718.      Header contain only fixed text.  The new section Page Footer
  1719.      contains the new field "page number" and the "Trim trailing
  1720.      spaces" attribute should be set to "Yes" in this.  This will
  1721.      keep the correct spacing of   - 9 -    and   - 10 -    when the
  1722.      page numbers are printed.
  1723.  
  1724.  
  1725.      So far all the fields we have printed are from the same form
  1726.      "Aircraft".  Suppose that we also wanted to list the country of
  1727.      origin for each aircraft.  The "Aircraft" form does not hold
  1728.      this information but the "Manufacturers" form has a field
  1729.      "Nationality". To incorporate this field into the report all we
  1730.      have to do is declare it as an output field and then arrange to
  1731.      have that field in memory when we print the list items. We can
  1732.      load the correct record from the "Manufacturers" form by using
  1733.      the linking data "Name" in the manufacturers form and
  1734.      "Manufacturer" in the "Aircraft" form.  This is a similar
  1735.      process to looking up data except that a pre defined
  1736.      relationship is not necessary. We can tell Easy Base exactly
  1737.      what we want within the code.
  1738.  
  1739.      Declare output fields
  1740.         Aircraft.knownas : Aircraft.type : Aircraft.mark
  1741.         Manufacturers.nationality : Page number
  1742.      end
  1743.      Declare variables
  1744.         Lasttype as text
  1745.      end
  1746.  
  1747.  
  1748.  
  1749.                                  - 29 -
  1750. ................................................................................
  1751.  
  1752.  
  1753.      '.....................PRINT REPORT HEADING...
  1754.      print report header
  1755.      '.................
  1756.      for aircraft with typename in order
  1757.         '..................PRINT HEADERS AND FOOTERS...
  1758.         if bottom Margin < 1 then
  1759.            bold on : print page footer
  1760.            page feed : print page header : bold off
  1761.         end if
  1762.         '..................PRINT GROUP HEADERS.........
  1763.         if aircraft.type <> lasttype then
  1764.            bold on : underline on
  1765.            print group header
  1766.            bold off : underline off
  1767.         end if
  1768.         '...............LOAD MANUFACTURERS NATIONALITY..
  1769.         for manufacturers with name = aircraft.manufacturer
  1770.            Print list items
  1771.         next
  1772.         '..............
  1773.      next
  1774.      print report footer
  1775.  
  1776.      Because the procedure code is becoming longer, remarks are
  1777.      added to make it easier to see which parts of the code do what.
  1778.      You can add remarks to your code anywhere by prefixing them
  1779.      with an apostrophe.
  1780.  
  1781.      At the point where we are about to print the list items we
  1782.      start another "For" loop.  This time "For Manufacturers".  When
  1783.      one "For" loop is "Nested" within another, the record currently
  1784.      loaded by the first loop remains in memory while the records
  1785.      selected by the "Nested" loop are processed and all the fields
  1786.      of both records are available at the same time.
  1787.  
  1788.      As we have qualified the "Manufacturers" loop:-
  1789.  
  1790.      for manufacturers with name = aircraft.manufacturer
  1791.  
  1792.      only the single record in which the "Name" field matches the
  1793.      "Aircraft.manufacturer" field which is currently loaded by the
  1794.      outer loop will be selected from the "Manufacturers" form.
  1795.  
  1796.      While we have both the required records in memory we print the
  1797.      list items.
  1798.  
  1799.      All that remains to do now is to edit the output format and add
  1800.      the "Manufacturers.nationality" field to the .List Items
  1801.      section.
  1802.  
  1803.  
  1804.  
  1805.  
  1806.  
  1807.                                  - 30 -
  1808. ................................................................................
  1809.  
  1810.  
  1811.      By nesting loops in this way, you can list data from any number
  1812.      of different forms which have "Linking" data in one of their
  1813.      fields.  Where only one record matches as in the example above
  1814.      then the required fields go in the .List items section with the
  1815.      other fields.  Where there are many matches (Related list) the
  1816.      fields from the secondary loop have their own print section.
  1817.      (See example on page 5)
  1818.  
  1819.      Now we can print any of the fields from any "Related" forms in
  1820.      any order.  We are still, however, listing all the records from
  1821.      the "Aircraft" form and we may for example only wish to print
  1822.      those records which are in the "Bomber" group.
  1823.  
  1824.      Start a new procedure and enter the code:-
  1825.  
  1826.      Declare output fields
  1827.         Aircraft.knownas : Aircraft.type : Aircraft.base
  1828.      end
  1829.      for aircraft with type = "Bomber"
  1830.         print list items
  1831.      next
  1832.  
  1833.      Create the output format placing the three output fields within
  1834.      the .List Items section.
  1835.  
  1836.      When you run this report, only the bombers will be listed but,
  1837.      once more, the aircraft names will be in the order in which
  1838.      they were entered to the form.
  1839.  
  1840.      To get them in alphabetic order we must again use the compound
  1841.      index on the "Typename" field. This time we have to ensure that
  1842.      the loop starts with the first "Bomber" and ends with the last
  1843.      "Bomber".
  1844.  
  1845.      Declare output fields
  1846.         Aircraft.knownas : Aircraft.type : Aircraft.base
  1847.      end
  1848.      declare variables
  1849.         group as text
  1850.      end
  1851.      group = "Bomber"
  1852.      for aircraft with typename > "Bomber"
  1853.         if aircraft.type <> group then exit for
  1854.         print list items
  1855.      next
  1856.  
  1857.      Before starting the "For" loop we set a variable "Group" to the
  1858.      value "Bomber". The "For" loop is then qualified such that the
  1859.      records will be processed with "Typename" in order but starting
  1860.      with the first occurrence of "Bomber" in the field.  To stop
  1861.      the loop when all the bombers have been processed we test the
  1862.      contents of the "Aircraft.type" field on each iteration of the
  1863.  
  1864.  
  1865.                                  - 31 -
  1866. ................................................................................
  1867.  
  1868.  
  1869.      loop and when the first record is loaded which is not a bomber
  1870.      we stop processing the loop with the command "Exit For".
  1871.  
  1872.      As in the first procedure, we could now add Page headers, Page
  1873.      footers and number the pages Etc.
  1874.  
  1875.      Suppose however that having created this procedure we now
  1876.      wanted a list of all the "Airliners".
  1877.  
  1878.      We could achieve this by changing "Bomber" to "Airliner" within
  1879.      the code but this would be time consuming. It would be much
  1880.      better if we could tell Easy Base which type group we wanted at
  1881.      the start of the procedure and have Easy Base make the
  1882.      necessary changes.
  1883.  
  1884.      To supply "Variables" to a procedure before running we use an
  1885.      "Input Screen", the third part of a procedure.  Save the code
  1886.      and select item 3 (Create Input Screen) from the procedures
  1887.      menu.
  1888.  
  1889.      As soon as you select item 3 Easy Base will ask if you wish to
  1890.      copy an existing form. Type "N" for no.  The next screen will
  1891.      be familiar to you.  It is exactly the same as the form design
  1892.      screen.
  1893.  
  1894.      When you first designed your forms, the form design routine
  1895.      performed two tasks. It created your form and also a default
  1896.      input screen from which to enter data. Now that you are about
  1897.      to create input screens for procedures, the same routine is
  1898.      used to design the screen.  It does not, of course, create a
  1899.      parallel form.
  1900.  
  1901.      All the facilities for "Polishing" your forms - all the
  1902.      facilities for deriving, calculating looking up and testing
  1903.      derivations which you had in Form Design are also available for
  1904.      Input Screen design.
  1905.  
  1906.      The only difference you will notice is that when you define a
  1907.      field, the "Unique" and "Indexed" attributes are marked "Not
  1908.      Applicable" and when you run the procedure, only the "Options"
  1909.      "Clear Screen after Running Procedure" and "Clear Field on
  1910.      Editing" are available.
  1911.  
  1912.      Move the cursor to somewhere near the middle of the screen and
  1913.      type:- "Which Aircraft type would you like listed".  Then press
  1914.      F10 to define a field.
  1915.  
  1916.      If, in the aircraft form the "Type" field had been defined as a
  1917.      choice field, then we would define this field as a choice field
  1918.      and use the same list.
  1919.  
  1920.      If, on the other hand the "Type" field in the "Aircraft" form
  1921.  
  1922.  
  1923.                                  - 32 -
  1924. ................................................................................
  1925.  
  1926.  
  1927.      looked up its contents from a core data form containing the
  1928.      type names then we would set the attributes:-
  1929.  
  1930.      Name            type
  1931.      Data type       text
  1932.      Field Length    15    (Same as the "Type" field in "Aircraft")
  1933.      Mandatory       Yes
  1934.      User Entry      Yes
  1935.      Display         Field  (or text or Alt colours as you wish)
  1936.      Derived         No
  1937.  
  1938.      The field will of course be derived:- Lookup(Aircraft,type)
  1939.      but as we have not yet entered the relationship, we will leave
  1940.      the derived attribute set to "No" to prevent an error message
  1941.      when we save the screen.
  1942.  
  1943.      Save the screen.  When you do, you will be asked to select
  1944.      between "Repeat Screen after F2" and "Run Once and Exit".
  1945.  
  1946.      If you choose the first option then the procedure will repeat
  1947.      until you press the Escape Key. If you choose the second
  1948.      option, control will return to the procedures menu after the
  1949.      report has been run.
  1950.  
  1951.      Now save the procedure.  Let's call it "Aircraft By Type".
  1952.  
  1953.      You may have noticed that all Form, Field and Procedure names
  1954.      so far have been single words.  There is no restriction on
  1955.      using multiple words in names but single ones make code much
  1956.      easier to read. The only good reason to use more than one word
  1957.      is in a reporting procedure name. After the procedure has been
  1958.      run the status line in Browse mode will be "Procedure:-
  1959.      Aircraft By Type" which makes more sense to an end user than
  1960.      "Procedure:- ACbytyp".
  1961.  
  1962.      Now go to Relationships and enter the relationship "Aircraft"
  1963.      between "Aircraft by Type" and "Aircraft" linking the two
  1964.      fields "Type".
  1965.  
  1966.      Reload the "Aircraft by Type" procedure and edit the Input
  1967.      screen setting the derived attribute to "yes" and entering the
  1968.      derivation formula:-  Lookup(aircraft,type)
  1969.  
  1970.      Save the screen again and select "Edit Procedure Code".
  1971.  
  1972.      To use the Input screen quickly you could change the two
  1973.      occurrences of "Bomber" to input.type. However, now that we
  1974.      have an input.type field the variable "group" is superfluous.
  1975.  
  1976.      The finished procedure code and Output format are shown on the
  1977.      next page.
  1978.  
  1979.  
  1980.  
  1981.                                  - 33 -
  1982. ................................................................................
  1983.  
  1984.  
  1985.      Declare output fields
  1986.         Aircraft.knownas : Aircraft.base
  1987.         Page number : input.type
  1988.      end
  1989.      Print report header
  1990.      for aircraft with typename > input.type
  1991.         if bottom margin < 1 then
  1992.            print report footer
  1993.            page feed : print page header
  1994.         end if
  1995.         if aircraft.type <> input.type then exit for
  1996.         print list items
  1997.      next
  1998.      print report footer
  1999.      page feed
  2000.  
  2001.  
  2002.      ......................Output Format.........
  2003.  
  2004.      .Report Header
  2005.             ══════════════════════════════════════════════
  2006.                           ████████████ LIST
  2007.                           ════════════
  2008.                 Name                   Built at
  2009.             ──────────────────────────────────────────────
  2010.      .Page header
  2011.             ──────────────────────────────────────────────
  2012.                 Name                   Built at
  2013.             ──────────────────────────────────────────────
  2014.      .List items
  2015.                 ████████████████████   █████████████████
  2016.      .Page Footer
  2017.  
  2018.                              - ██ -
  2019.      .Report Footer
  2020.             ══════════════════════════════════════════════
  2021.      .End
  2022.  
  2023.  
  2024.      The field in the Report header is input.type.  The fields in
  2025.      the list items are Aircraft.knownas and Aircraft.base.
  2026.      The field in the page footer is Page number.
  2027.  
  2028.      Suppose now that we print out the report and find that we had
  2029.      entered all the "Aircraft" "Knownas" fields in Upper case and
  2030.      all the "Base" fields in Lower case.  This would make the
  2031.      report quite untidy.  There is no need however to change the
  2032.      original data. To print both fields in Upper case all we need
  2033.      to do is alter each of the "Base" field contents using the
  2034.      "Upper" Function before printing it.
  2035.  
  2036.      To do this insert the line:-
  2037.  
  2038.  
  2039.                                  - 34 -
  2040. ................................................................................
  2041.  
  2042.  
  2043.         aircraft.base = upper(aircraft.base)
  2044.  
  2045.      immediately before the print list items command.
  2046.  
  2047.      As well as simply "Listing" data you can manipulate it in many
  2048.      different ways.  You can do any form of arithmetic on numeric
  2049.      fields and you can alter text, date and time fields with over
  2050.      fifty different functions.
  2051.  
  2052.      A function is a small internal routine which returns a value
  2053.      derived from one or more other values (Parameters) which you
  2054.      supply.  For Example, in the code line:-
  2055.  
  2056.      date = datetext(invoice.date)
  2057.  
  2058.      "Datetext" is a function to which you are passing the parameter
  2059.      "Invoice.date".  If invoice.date is 02/02/94 then the function
  2060.      "Datetext" will derive the text "2nd February 1994" and
  2061.      "Return" this as if it were a variable. The output field "Date"
  2062.      will therefore become "2nd February 1994".
  2063.  
  2064.      A functions parameters are always passed to it enclosed in
  2065.      brackets.  If there are more than one then they are separated
  2066.      by commas.
  2067.  
  2068.      The next section of the Manual introduces you to Procedures
  2069.      which perform transactions.  You should now read the
  2070.      descriptions of the following commands in the Programmers
  2071.      Reference.
  2072.  
  2073.      Copy All From
  2074.      Delete Record
  2075.      Clear Records From
  2076.      Update Record
  2077.      Pause On/Off
  2078.      Escape On/Off
  2079.  
  2080.      Together with the field control "Beep".
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.                                  - 35 -
  2098. ................................................................................
  2099.  
  2100.  
  2101.                      PROCEDURES (TRANSACTIONAL)
  2102.  
  2103.      In Data Entry you make a "Transaction" when you add, update or
  2104.      delete a record.  You can make the same transactions in
  2105.      procedures.  There are, however, two major advantages to
  2106.      making your transactions via procedures.
  2107.  
  2108.      1.   You control which transactions can and cannot be made.
  2109.  
  2110.      2.   You can make any number of different transactions in any
  2111.           number of different forms.
  2112.  
  2113.      Consider the "Customers" form.  You would want any of your
  2114.      staff to be able to add a new customer in your absence. If you
  2115.      allow them to do this in Record Entry then they could also
  2116.      (deliberately or inadvertently) alter or delete other customers
  2117.      records.
  2118.  
  2119.      To prevent this, create a new procedure.  Create an input
  2120.      screen.  When you are asked if you wish to copy an existing
  2121.      form - reply "Yes" and select the customers form.  Save the
  2122.      input screen and select Create Procedure Code. Now enter the
  2123.      procedure code:-
  2124.  
  2125.      for customers new record
  2126.         copy all from input
  2127.      next
  2128.  
  2129.      Save the procedure - Let's call it "Enter customers".  You can
  2130.      now call this procedure from your "User Menus" described in the
  2131.      next section and your staff will be able to enter new customers
  2132.      without the opportunity to make any other transactions.
  2133.  
  2134.      You can also control parts of a transaction.  If your
  2135.      "Customers" form had a field for "Creditlimit" then, in the
  2136.      form, you would wish to be able to enter any credit limit you
  2137.      wanted, but you might wish to restrict the amount your staff
  2138.      could enter for a new customer.
  2139.  
  2140.      To do this you simply edit the field attributes for the
  2141.      "Creditlimit" field in the input screen.
  2142.  
  2143.      To set a fixed credit limit of say £500.00 set the user entry
  2144.      attribute to "No", the derived attribute to "Yes" and enter the
  2145.      derivation formula:- 500.
  2146.  
  2147.      To restrict the entry to a maximum of say £1000.00 you would
  2148.      leave the user entry attribute set to "yes" but derive the
  2149.      field:-  If(creditlimit > 1000,blank[beepMaximum credit £1000
  2150.               for new customers],creditlimit)
  2151.  
  2152.      There might also be fields on the "Customers" form which are
  2153.  
  2154.  
  2155.                                  - 36 -
  2156. ................................................................................
  2157.  
  2158.  
  2159.      irrelevant to the transaction of adding a new customer.  You
  2160.      might also have fields for personal comments which you do not
  2161.      wish your staff to see.  You can simply delete these from the
  2162.      input screen or change them to invisible.
  2163.  
  2164.      In other words you can limit a transaction in any way you wish
  2165.      and the final input screen can be totally different to the
  2166.      original form.
  2167.  
  2168.      Transaction procedures which delete or update records are
  2169.      created in a similar manner but are slightly more complicated.
  2170.  
  2171.      To create a procedure which allows your staff to delete
  2172.      customers, you would again copy the customers form as the input
  2173.      screen.  This time, the only field to which you allow User
  2174.      Entry is the "acountno" field.  You enter a relationship
  2175.      between this report and the "Customers" form linking "acountno"
  2176.      and derive all the other fields you wish to show as:-
  2177.  
  2178.      lookup(customers,name)
  2179.      lookup(customers,address)
  2180.      Etc.
  2181.  
  2182.      Your staff now enter the account number to be deleted. The
  2183.      other "looked up" fields are only there so that the name and
  2184.      address will appear confirming that the correct account number
  2185.      has been entered.
  2186.  
  2187.      The procedures code to delete the record is:-
  2188.  
  2189.      for customers with acountno = input.acountno
  2190.         delete record
  2191.      next
  2192.  
  2193.      As with the procedure to add a record you are still in complete
  2194.      control of what can or cannot be done.  Suppose that you had a
  2195.      field on the "customers" form which you kept updated with his
  2196.      account balance.  You would not want anyone to delete a
  2197.      customer who still had an outstanding balance on his account.
  2198.  
  2199.      To prevent this, just change the derivation for the "balance"
  2200.      field to :-
  2201.  
  2202.      if(lookup(customers,balance) <> 0,blank[beepCustomers cannot be
  2203.      deleted until their A/C is clear],0)
  2204.  
  2205.      You would also set the Mandatory attribute to "Yes" to prevent
  2206.      anyone from ignoring the warning.
  2207.  
  2208.      If you wanted a procedure which allowed staff to change a
  2209.      customers address but no other fields, then you would create
  2210.      the same input screen as for the delete record and the same
  2211.  
  2212.  
  2213.                                  - 37 -
  2214. ................................................................................
  2215.  
  2216.  
  2217.      relationship but this time you would allow user entry to the
  2218.      address field and derive it:-
  2219.  
  2220.      Default(lookup(customers,address))
  2221.  
  2222.      When the operator enters the account number for the customer
  2223.      whose address he wishes to change, the old address will appear
  2224.      to confirm that he has the right customer, but he will be able
  2225.      to edit it.
  2226.  
  2227.      The procedure code would be:-
  2228.  
  2229.      for customers with acountno = input.accountno
  2230.         customers.address = input.address
  2231.         update record
  2232.      next
  2233.  
  2234.      The second advantage of making transactions via procedures is
  2235.      that you can perform several tasks at once. Consider a Video
  2236.      Library hiring films to its members. There will be a form for
  2237.      the films, one for the members and one for daily takings.
  2238.  
  2239.      The procedure used for hiring out the films will have an input
  2240.      screen with a field for the members number, possibly three
  2241.      fields for the film numbers being hired, three more fields in
  2242.      which the films rental prices are looked up and one in which
  2243.      these three fields are totalled.  When the operator runs the
  2244.      procedure all the necessary transactions are performed by the
  2245.      procedure code:-
  2246.  
  2247.      for members with number = input.member
  2248.         if input.film1 <> blank then members.film1 = input.film1
  2249.         if input.film2 <> blank then members.film2 = input.film2
  2250.         if input.film3 <> blank then members.film3 = input.film3
  2251.         update record
  2252.      next
  2253.      if input.film1 <> blank then
  2254.         for films with number = input.film1
  2255.            films.hiredto = input.member
  2256.            films.datehired = system date
  2257.            update record
  2258.         next
  2259.      end if
  2260.      for daily takings
  2261.         total = total + input.total
  2262.         update record
  2263.      next
  2264.  
  2265.      The mid section of the code updating film1's record would of
  2266.      course be repeated for film2 and film3 but has been omitted for
  2267.      clarity.
  2268.  
  2269.  
  2270.  
  2271.                                  - 38 -
  2272. ................................................................................
  2273.  
  2274.  
  2275.                             USER MENUS
  2276.  
  2277.      Once you have created forms and procedures you can create an
  2278.      end user menu system to run them.  You could wait till all your
  2279.      procedures are finished but you will get a much better feel for
  2280.      how your program is developing if you start and use a menu
  2281.      system as you go.  Easy Base includes a User Menu call to its
  2282.      system menus so you can work from your own developing menu
  2283.      system while you are still developing your program.
  2284.  
  2285.      Select "Menus" from the main menu and have a look at the
  2286.      screen.  The Menus screen is an internal form just like the
  2287.      ones you have created. You have all the same facilities to
  2288.      enter, update and delete menus that you have in Data Entry to
  2289.      one of your own forms.
  2290.  
  2291.      Let's create a menu based on some of the forms and procedures
  2292.      previously discussed.
  2293.  
  2294.      The first field on the menus form is "Menu Name".  This is the
  2295.      unique field and a name must be supplied.  We'll call it
  2296.      "Customers".  The next field is "Menu Type". This is a choice
  2297.      field with two options, "Normal" and "Batch Execute".  The
  2298.      "Batch Execute" option will be discussed later.  For now,
  2299.      select "Normal".
  2300.  
  2301.      The third field is "Menu Title". Whatever you enter here will
  2302.      be displayed as a title (or heading) above your menu.
  2303.  
  2304.      The fourth field which is untitled on the screen is a choice
  2305.      field with the options, "Run on Number Key" and "Run on Return
  2306.      Key".  If you choose the first option then the items on your
  2307.      menu will be run as soon as the item number is pressed and if
  2308.      you choose the second option then typing the item number will
  2309.      move the highlight bar to the selection but the item will not
  2310.      be called until the return key is pressed.  In either case you
  2311.      will still be able to select items with the cursor control keys
  2312.  
  2313.      The next field asks for a "Sign on password" if a startup menu.
  2314.      You can start your application (program) on any menu that has
  2315.      a sign on password by restarting Easy Base and using that
  2316.      password instead of your developers password.  In this case we
  2317.      are going to menu the reports which add, delete and alter a
  2318.      customers address. This will be a sub menu so we leave this
  2319.      field blank.
  2320.  
  2321.      The main section of the "Menus" form has three columns of nine
  2322.      fields.  The first column is for the text to be displayed on
  2323.      the menu.  The second is for the type of action (function)
  2324.      which is to be called.  The third is for the individual item.
  2325.  
  2326.  
  2327.  
  2328.  
  2329.                                  - 39 -
  2330. ................................................................................
  2331.  
  2332.  
  2333.      With the cursor in the first text field we type:-
  2334.  
  2335.      Enter a New Customer      and press return.
  2336.  
  2337.      As soon as the cursor moves to the first "Function" field a
  2338.      menu appears listing all the different functions that can be
  2339.      called.  The first four choices allow you to:-
  2340.  
  2341.      1.   Run one of your procedures.
  2342.      2.   Recall the last output from one of your procedures.
  2343.      3.   Call the data entry screen for one of your forms.
  2344.      4.   Call another of your menus.
  2345.  
  2346.      The other functions are selected utilities from the system
  2347.      utilities menu which you may wish to provide to the
  2348.      end user without allowing him access to the entire system.
  2349.  
  2350.      Select "Run Procedure" and press return.
  2351.  
  2352.      When the cursor moves to the "Item" column Easy Base will list
  2353.      all your procedures. Choose "Enter customers".
  2354.  
  2355.      on the next two lines enter:-
  2356.  
  2357.      Delete Existing Customer   Run Procedure    Delete Customers
  2358.      Change Customers Address   Run Procedure    Address Change
  2359.  
  2360.      and press F2 to save the menu.
  2361.  
  2362.      Now let's make a start to the main "Startup" menu.  We may not
  2363.      have any procedures to put on it yet but we can get started
  2364.      with an item to call data entry to "Customers" and one to call
  2365.      the "Customers" sub menu.
  2366.  
  2367.      Fill in a new menus record using the name "Main Menu", Type
  2368.      "Normal" and Title "- M A I N   M E N U -".  This time enter a
  2369.      startup password, say "Fred".  Complete the Items section
  2370.      with:-
  2371.  
  2372.      Customers Records          Data Entry       Customers
  2373.      Customer Updates           User Menu        Customers
  2374.      Program Development        System menus
  2375.  
  2376.      Press F2 to save this menu then press escape all the way out to
  2377.      the DOS prompt (or your hard disk menu system).  Restart Easy
  2378.      Base.  This time, when the sign on screen appears, enter "Fred"
  2379.      and press return.
  2380.  
  2381.      Instead of the system menus, you will see your "Main Menu".
  2382.      If you select item 1 the "Customers" form will come up. If you
  2383.      select item 2 your sub menu will be overlaid and you can run
  2384.      any of the three procedures on it.  If you select item 3 you
  2385.  
  2386.  
  2387.                                  - 40 -
  2388. ................................................................................
  2389.  
  2390.  
  2391.      will be transferred to the Easy Base System menus where you can
  2392.      continue with the development of your program.
  2393.  
  2394.      Whenever you create new procedures or forms you can add them to
  2395.      your menu system.
  2396.  
  2397.      Suppose you would like the utilities, Backup Data, Restore Data
  2398.      and Install Printer to be available from your menu system.
  2399.      Create a new menu, let's call it "Utilities" with the items:-
  2400.  
  2401.      Backup data to disk        Backup Data
  2402.      Restore data from disk     Restore Data
  2403.      Install Printer            Install Printer
  2404.  
  2405.      Save this new menu then edit your main menu to include the new
  2406.      item:-
  2407.  
  2408.      Utilities                  User menu           Utilities
  2409.  
  2410.      When you have called the Easy Base system menus from one of
  2411.      your own menus then pressing escape does not exit the program,
  2412.      it returns you to your own menu.  You close down by pressing
  2413.      escape from your main menu.  When you get back to your "Main
  2414.      Menu" you will notice that the new "Utilities" item is not
  2415.      there. New Menu items cannot be added while the program is
  2416.      running. To incorporate the "Utilities" item you must again
  2417.      exit the program and restart with the password "Fred".
  2418.  
  2419.      As your program develops you can create as many menus as you
  2420.      need. Your "Main Menu" can call up to nine sub menus. Each of
  2421.      those can call another nine sub sub menus Etc Etc. You can also
  2422.      have additional startup menus with different passwords. These
  2423.      can either run completely different menus or can restrict
  2424.      different parts of the menu system to different users.
  2425.  
  2426.      When you start up on one of your menus systems Easy Base
  2427.      creates a default "Tree" structure for it.  From whichever menu
  2428.      is on screen the escape key backsteps down the tree until you
  2429.      reach your "Main Menu" and then exits the program.
  2430.  
  2431.      If one of the "forward" menu calls crosses branches, ie it
  2432.      calls a menu which is also called from a lower level then
  2433.      subsequent presses of the escape key backstep down the current
  2434.      branch and not back "cross tree".
  2435.  
  2436.      You can also make menu calls from low to high levels. (a sub-
  2437.      sub- sub menu can have an item which calls the main menu).
  2438.  
  2439.      In some circumstances you may prefer a hierarchical rather than
  2440.      a tree structure where the main menu is recalled after each
  2441.      individual procedure.  To accomplish this, each final item is
  2442.      placed on its own menu followed by a call to the main menu and
  2443.  
  2444.  
  2445.                                  - 41 -
  2446. ................................................................................
  2447.  
  2448.  
  2449.      the menu type is changed to "Batch Execute".
  2450.  
  2451.      When you create a "Batch Execute" menu then instead of
  2452.      displaying a menu for you to choose from, Easy Base
  2453.      executes each item on the menu in sequence and then returns to
  2454.      the menu which called it.
  2455.  
  2456.      With batch execute menus you can automate many of the processes
  2457.      in your application.  If you have several printouts to be done
  2458.      each day you can have them all done from batch execute menus.
  2459.      Similarly, if you need to update many reporting procedures for
  2460.      later "Recall" to the screen, these can all be done at once.
  2461.      There is no limit to the number of procedures which can be
  2462.      batched - One batch menu can call another.
  2463.  
  2464.      If you create a "Startup" batch menu then, provided it does not
  2465.      call a "Normal" menu, Easy Base will perform all the tasks on
  2466.      the menu and then exit to DOS.
  2467.  
  2468.      If you create a "Startup" batch menu which eventually calls a
  2469.      "Normal" menu then the batch process stops at that point and
  2470.      the "Normal" menu becomes the main (root) menu.  Pressing
  2471.      escape from this menu exits to DOS. it never returns to the
  2472.      startup batch menu which called it
  2473.  
  2474.      Start up batch menus are useful for running regular daily
  2475.      procedures and for forcing the user to check the system date
  2476.      and time.
  2477.  
  2478.      There are many other uses for batch execute menus.  You can
  2479.      automate menu changes. If, for example, running one particular
  2480.      procedure is invariably followed by  running one from a choice
  2481.      of three others then the menu containing the others can be
  2482.      batched after the first procedure.
  2483.  
  2484.      In Easy Base you can create quite long and complex procedures
  2485.      but they are eventually limited by memory constraints.  If you
  2486.      ever run out of memory creating a long procedure then just
  2487.      split it and batch the parts.
  2488.  
  2489.      Don't forget to set the output of non print reports to "Disk"
  2490.      otherwise Browse Mode will be invoked.
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.                                  - 42 -
  2504. ................................................................................
  2505.  
  2506.  
  2507.                          SYSTEM REQUIREMENTS
  2508.  
  2509.      Required.
  2510.  
  2511.          IBM or compatible 286 or higher
  2512.          1Meg Ram
  2513.          600k free conventional memory (for DOS5 and later this
  2514.                  requires the lines:-
  2515.                  device=c:\dos\himem.sys
  2516.                  DOS=high
  2517.                  in your config.sys file)
  2518.  
  2519.      Preferred.
  2520.  
  2521.         3 Meg expanded memory with 2 Meg allocated to PC-Cache
  2522.  
  2523.  
  2524.  
  2525.                          SYSTEM LIMITATIONS
  2526.  
  2527.      Fields per Form         500
  2528.      Indexes per Form        500
  2529.      Record Length           Limited by display of 4 screen pages
  2530.      Records per Form        Limited by Maximum data or index file
  2531.                              length of 2,100 Megabytes
  2532.  
  2533.      Forms per application       }     Total of 500 in
  2534.      Procedures per application  }     any combination.
  2535.      Menus per application             500
  2536.  
  2537.  
  2538.  
  2539.  
  2540.  
  2541.  
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548.  
  2549.  
  2550.  
  2551.  
  2552.  
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.                                  - 43 -
  2562. ................................................................................
  2563.  
  2564.  
  2565.                        DOS FILENAME CONVENTIONS
  2566.  
  2567.      The Easy Base system files are:-
  2568.  
  2569.         EB.EXE     The program file
  2570.         EB.CUR     Initial screen setup
  2571.         EB.SET     Configuration file
  2572.         EB.MEN     User Menus form
  2573.         EB.REL     Relationships form
  2574.         EB.MSG     Text and error messages
  2575.         EB.PRS     Printer drivers
  2576.         EB.D01     Main dictionary
  2577.         EB.DO2     Personal dictionary
  2578.  
  2579.      The files which are created in the data directories have the
  2580.      following filename convention:-
  2581.  
  2582.      Forms:-
  2583.  
  2584.         BASE(No).DEF      The entry screen definition.
  2585.         BASE(No).DAT      The data file.
  2586.         BASE(No).(No)     Index files.
  2587.  
  2588.      Choice field lists
  2589.  
  2590.         LIST(No).DAT
  2591.  
  2592.      Procedures
  2593.  
  2594.         PROC(No).PRO      The procedure code.
  2595.         PROC(No).DEF      The input screen.
  2596.         PROC(No).REP      The output from the procedure.
  2597.  
  2598.      There are also six individual files:-
  2599.  
  2600.         MENUS.DAT         The menus you create.
  2601.         RELATION.DAT      The relationships you create.
  2602.         CHOICES.DIR       The choice list directory.
  2603.         BASE.DIR          The forms directory.
  2604.         PROC.DIR          The procedures directory.
  2605.         RECOVER.INF       Recovery information to reinstate a form
  2606.                           should you suffer a power failure during
  2607.                           a pack or reformat operation.
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.                                  - 44 -
  2620. ................................................................................
  2621.